作者:游太虚傲寰宇 | 来源:互联网 | 2023-09-11 10:59
篇首语:本文由编程笔记#小编为大家整理,主要介绍了32.Python面向对象描述符运算符底层装饰器:闭包-闭包参数-内置装饰器-类装饰器相关的知识,希望对你有一定的参考价值。
篇首语:本文由编程笔记#小编为大家整理,主要介绍了32.Python面向对象描述符运算符底层装饰器:闭包-闭包参数-内置装饰器-类装饰器相关的知识,希望对你有一定的参考价值。
目录:
- 每篇前言:
- Python面向对象(五)
- 1.1 描述符
- 1.2 运算符底层调用的什么?
- 1.3 装饰器
- 第一部分——引入门
- (1)首先、咱再看遍闭包是啥:
- (2)然后,咱稍微高级点,看看闭包参数。
- (3)最后,就来看看第一种装饰器:
- 第二部分——类里面的内置装饰器
- (1)引入
- (2)第一个是把类里面的方法变为属性:
- (3)静态方法
- (4)第三个是类方法:
- 第三部分——最后阶段
- (1)类装饰器 必须使用__call__方法
- (2)看看高级点的
- 拓展一下呗——来个装饰器的习题
每篇前言:
-
🏆🏆作者介绍:【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者 |
- 🔥🔥本文已收录于Python全栈系列专栏:《Python全栈基础教程》
- 🔥🔥热门专栏推荐:《Django框架从入门到实战》、《爬虫从入门到精通系列教程》、《爬虫高级》、《前端系列教程》、《tornado一条龙+一个完整版项目》。
- 📝📝本专栏面向广大程序猿,为的是大家都做到Python从入门到精通,同时穿插有很多很多习题,巩固学习。
- 🎉🎉订阅专栏后可私聊进一千多人Python全栈交流群(手把手教学,问题解答); 进群可领取Python全栈教程视频 + 多得数不过来的计算机书籍:基础、Web、爬虫、数据分析、可视化、机器学习、深度学习、人工智能、算法、面试题等。
- 🚀🚀加入我一起学习进步,一个人可以走的很快,一群人才能走的更远!
Python面向对象(五)
1.1 描述符
描述符协议:python描述符是一个“绑定行为”的对象属性,在描述符协议中,它可以通过方法重写属性的访问。这些方法有__get__()
, __set__()
, 和__delete__()
。
如果这些方法中的任何一个被定义在一个对象中,这个对象就是一个描述符
举例说明:
"""
__author__ = 孤寒者
"""
class Base:
def __get__(self,instance,owner):
print('恭喜玩家获得荒古宝典')
def __set__(self, instance,value):
print('强化%s'%value)
def __delete__(self,instance):
print('武器已经损坏')
class A:
base = Base()
a = A()
a.base
a.base = 50
del a.base
1.2 运算符底层调用的什么?
举例说明:
"""
__author__ = 孤寒者
"""
class A:
def __init__(self,num1,num2):
self.num1 = num1
self.num2 = num2
def __add__(self,other):
sum1 = self.num1 + other.num1
sum2 = self.num2 + other.num2
return sum1,sum2
a = A(1,2)
b = A(3,4)
print(a+b)
运算符方法(了解即可)
__add__(self,other)
__sub__(self,other)
__mul__(self,other)
__mod__(self,other)
__iadd__(self,other)
__isub__(self,other)
__radd__(self,other)
__rsub__(self,other)
__imul__(self,other)
__imod__(self,other)
1.3 装饰器
有这个玩意的原因:python是一个动态语言,因为一切都是对象。是一个脚本语言。
第一部分——引入门
(1)首先、咱再看遍闭包是啥:
"""
__author__ = 孤寒者
"""
def fun1():
print('fun1')
def fun2():
print('fun2')
return fun2
a = fun1()
a()
(2)然后,咱稍微高级点,看看闭包参数。
这种方法比较麻烦,所以下面就引入了装饰器,和这个的功能一模一样,不过
简单了许多:
"""
__author__ = 孤寒者
"""
def aa(fun):
print('------------aa')
def bb():
fun()
print('----------bb')
return bb
def f1():
print('this is f1')
def f2():
print('this is f2')
cc = aa(f1)
cc()
(3)最后,就来看看第一种装饰器:
"""
__author__ = 孤寒者
"""
def aa(fun):
print('------------aa')
def bb():
fun()
print('----------bb')
return bb
@aa
def f1():
print('this is f1')
def f2():
print('this is f2')
f1()
第二部分——类里面的内置装饰器
(1)引入
"""
__author__ = 孤寒者
"""
class Base:
def fun(self):
print('好好学习,天天向上')
b = Base()
b.fun()
正题:
(2)第一个是把类里面的方法变为属性:
"""
__author__ = 孤寒者
"""
class Base:
name = '孤寒者'
@property
def fun(self):
return('好好学习,天天向上')
b = Base()
print(b.name)
print(b.fun)
(3)静态方法
- 第二个是把类里面的方法变为静态方法,让其可以像使用函数一样去使用,而不需要再实例化才能使用:
"""
__author__ = 孤寒者
"""
class Base:
@staticmethod
def fun2():
print('过年好,新年好')
def func(self):
print('这是普通方法')
Base.fun2()
Base().func()
(4)第三个是类方法:
"""
__author__ = 孤寒者
"""
class Base:
def func(self):
print('这是普通方法')
@classmethod
def fun3(cls):
print('cls类方法')
cls().func()
Base.fun3()
第三部分——最后阶段
(1)类装饰器 必须使用__call__方法
"""
__author__ = 孤寒者
"""
class Base:
def __init__(self,name):
self.name = name
def __call__(self,*args,**kwargs):
print('this is call')
@Base
def func():
print('this is func')
func()
(2)看看高级点的
"""
__author__ = 孤寒者
"""
class Base:
def __init__(self,fun):
self.fun = fun
def __call__(self,*args,**kwargs):
self.fun()
print('this is call')
def __str__(self):
return 'this is str'
@Base
def func():
print('this is func')
func()
print(func)
拓展一下呗——来个装饰器的习题
- 测试type和isinstance两个函数,哪个速度更加的快?
需要注意的是:程序运行速度比较快 只查看上面两个函数 运行一次的时间显示不出来效果,可以查看循环一万次的时间。
"""
__author__ = 孤寒者
"""
import time
def funa(fun):
def funb():
a = time.time()
fun()
b = time.time()
print('函数运行了%s'%(b-a))
return funb
@funa
def f1():
for i in range(100000):
type(1)
f1()
@funa
def f2():
for i in range(100000):
isinstance(1,int)
f2()